package com.example.boot6rabbitmqhigher2.controller;


import com.example.boot6rabbitmqhigher2.product.DefaultSender;
import com.example.boot6rabbitmqhigher2.product.FanoutSender;
import com.example.boot6rabbitmqhigher2.product.TopicSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 本工程是rabbit集群、管理控制台 实践
 *
 *
 * 1.集群的目的在于
 * 保证在一台不能使用的情况下，有其他服务可用
 * 增加节点线性增加吞吐量
 *
 * rabbitmq 集群特点
 *   官方推荐 至少两个dis（磁盘）方式，如果是一个dis + 一个内存（ram）方式，
 *   这样如在有rabbitmq服务加入集群时，会出现的问题（问题可以在做深入）
 *   会现的问题：任何修改操作（比如创建队列、交换器、添加和删除集群节点）都无法进行
 *   1》rabbitmq 在集群环境下将服务分成了三个部分分别是：元数据，队列，交换器
 *      元数据，交换器（数据会备份），队列（不会备份）
 *   2》为了不让队列丢失，解决方案是镜像队列，这样就队列就可以有备份了，
 *      基本上满足了rabbitmq可用的目的，一台服务坏掉，还可以有其他服务提供使用
 * 为了集群的高可用：
 *      引入HAProxy 负载均衡
 *
 *  2.管理后台使用的讲解
 *
 *  boot6-rabbitmq-higher
 *  boot6-rabbitmq-higher-2
 *  代码在native项目中:路径
 *  E:\腾讯下载\2、第二期课程（java-vip）\（09）消息中间件——King老师\06-2019.09.29-RabbitMQ管理与高可用集群（消息中间件）\rabbitmq\native
 *
 */
@RestController
public class RabbitController {

    @Autowired
    private DefaultSender defaultSender;
    @Autowired
    private TopicSender topicSender;
    @Autowired
    private FanoutSender fanoutSender;


    /**
     * 同一个项目中有生产者有消费者，加入消费者或者生产者只是为了验证rabbitmq的知识
     * 普通类型测试
     */
    @GetMapping("/hello")
    public void hello() {
        //mq的消息发送
        defaultSender.send("hello msg!");
    }

    /**
     * topic exchange类型rabbitmq测试
     */
    @GetMapping("/topicTest")
    public void topicTest() {
        topicSender.send();
    }

    /**
     * fanout exchange类型rabbitmq测试
     */
    @GetMapping("/fanoutTest")
    public void fanoutTest() {
        fanoutSender.send("hellomsg:OK");
    }
}
